package com.dexter.year2023.charpter3_array.level1.topic1_1添加删除;

/**
 * 数组基本法，查找元素，添加元素，删除元素
 *
 * @author Dexter
 */
public class AddDelete {
    public static void main(String[] args) {
        int[] a = new int[5];
        a[0] = 1;
        a[1] = 4;
        a[2] = 6;
        System.out.println(findByElement(a, 3, 4));
        System.out.println("新添加索引位置：" + addByElementSequence(a, 3, 5));
        printArr(a);

        System.out.println("新添加索引位置：" + addByElementSequence2(a, 4, 0));
        printArr(a);

        int size = removeByElement(a, 5, 1);
        System.out.println("删除后剩余元素个数为：" + size);
        printArr(a);
        /* 0 4 5 6 6
        6 这个6是前面已删除元素多出来的一位，应该是根据size访问不到的*/
    }

    /**
     * 挨个查找元素
     *
     * @param arr
     * @param size 已存放的元素个数
     * @param key  带查找的元素
     * @return 查找到的元素索引
     */
    public static int findByElement(int[] arr, int size, int key) {
        for (int i = 0; i < size; i++) {
            if (arr[i] == key) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 添加元素（注意边界）
     *
     * @param arr
     * @param size    已存放的元素个数，从1开始编号
     * @param element 待添加的元素
     * @return 新添加的元素索引
     */
    public static int addByElementSequence(int[] arr, int size, int element) {
        // 判断size是否已满，当size=arr.length时，不能再添加元素了
        if (size >= arr.length) {
            return -1;
        }
        // 默认添加到最后
        int index = size;
        for (int i = 0; i < size; i++) {
            if (element < arr[i]) {
                // 找到确切的插入位置
                index = i;
                break;
            }
        }
        // 添加元素之前，先移动index后面的元素
        for (int i = size; i > index; i--) {
            arr[i] = arr[i - 1];
        }
        arr[index] = element;
        return index;
    }

    /**
     * 倒着比较，添加元素（作业）
     *
     * @param arr
     * @param size
     * @param element
     * @return
     */
    public static int addByElementSequence2(int[] arr, int size, int element) {
        // 判断size是否已满，当size=arr.length时，不能再添加元素了
        if (size >= arr.length) {
            return -1;
        }
        // 默认添加到开头
        int index = 0;
        for (int i = size - 1; i >= 0; i--) {
            if (arr[i] < element) {
                index = i + 1;
                break;
            }
            // 往后移动
            arr[i + 1] = arr[i];
        }
        arr[index] = element;
        return index;
    }

    /**
     * 删除元素
     *
     * @param arr
     * @param size
     * @param key
     * @return 剩余存储元素的个数
     */
    public static int removeByElement(int[] arr, int size, int key) {
        int index = -1;
        for (int i = 0; i < size; i++) {
            if (arr[i] == key) {
                index = i;
                break;
            }
        }
        //要删除
        if (index != -1) {
            // 从index+1位置，向前覆盖
            for (int i = index + 1; i < size; i++) {
                arr[i - 1] = arr[i];

            }
            size--;
        }
        return size;
    }

    /**
     * 打印数组（最傻瓜式）
     *
     * @param arr
     */
    private static void printArr(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                System.out.println(arr[i]);
            }
            System.out.print(arr[i] + " ");
        }
    }
}
